package com.qing.recursion;

/**
 * 递归
 * 通过递归可以用简单的程序来解决复杂的方法，大大减少了代码量，它的能力在于用有限的语句来定义对象无限的集合
 * 递归包括两个部分
 * 1：递归头，什么时候不调用自身方法，如果没有头，将会陷入死循环
 * 2：递归体：什么时候需要调用自身方法
 */
public class Recursion {
    /**
     * 计算阶乘
     * 1! 1
     * 2! 2 * 1
     * 3! 3 * 2 * 1
     * ...
     * 5! 5 * 4 * 3 * 2 * 1
     */
    public static int factorial(int num) {
        if (num == 1) {
            return 1;
        } else {
            return num * factorial(num - 1);
        }
    }

    /**
     * 输入3 会计算3 + 2 + 1
     * @param num
     * @return
     */
    public static int sum(int num){
        if(num == 1){
            return 1;
        }else{
            return num + sum(num - 1);
        }

    }

    public static void main(String[] args) {
        System.out.println(factorial(5));
        System.out.println(sum(10));
    }
}
